package co.edu.udea.iw.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import co.edu.udea.iw.dao.DispositivoDAO;
import co.edu.udea.iw.dto.Dispositivo;
import co.edu.udea.iw.exception.IWDaoException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
 * Clase que hereda de HibernateDaoSupport e implementa (sobrescribe) los
 * metodos del dao del dispositivo
 * 
 * @author Santiago Ruiz
 * @author Bladimir Velez
 *
 */

public class DispositivoDAOImpl extends HibernateDaoSupport implements
		DispositivoDAO {

	/**
	 * Entrega la lista de todos los dispositivos existentes en base de datos
	 * 
	 * @return lista dispositivos
	 * @throws IWDaoException
	 */
	@Override
	public List<Dispositivo> obtenerDispositivos() throws IWDaoException {
		Session session = null;
		List<Dispositivo> dispositivos = new ArrayList<Dispositivo>();

		try {
			session = getSession();
			Criteria criteria = session.createCriteria(Dispositivo.class);
			dispositivos = criteria.list();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}
		return dispositivos;
	}

	/**
	 * Entrega los datos de un dispositivo dado su identificador
	 * 
	 * @param id
	 *            id identificador del dispositivo
	 * @return instancia con los datos del dispositivo obtenido, si no existe el
	 *         dispositivo retorna null.
	 * @throws IWDaoException
	 */
	@Override
	public Dispositivo obtenerDispositivo(Integer id) throws IWDaoException {
		Session session = null;
		Dispositivo dispositivo = null;

		try {
			session = getSession();
			dispositivo = (Dispositivo) session.get(Dispositivo.class, id);

		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}
		return dispositivo;
	}

	/**
	 * Agrega un dispositivo
	 * 
	 * @param dispositivo
	 *            dispositivo a agregar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void agregarDispositivo(Dispositivo dispositivo)
			throws IWDaoException {
		Session session = null;

		try {
			session = getSession();
			session.beginTransaction();
			session.save(dispositivo);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}

	}

	/**
	 * Elimina un dispositivo
	 * 
	 * @param dispositivo
	 *            dispositivo a eliminar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void eliminarDispositivo(Dispositivo dispositivo)
			throws IWDaoException {
		Session session = null;

		try {
			session = getSession();
			session.beginTransaction();
			session.delete(dispositivo);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}
	}

	/**
	 * Actualiza un dispositivo
	 * 
	 * @param dispositivo
	 *            dispositivo a actualizar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void actualizarDispositivo(Dispositivo dispositivo)
			throws IWDaoException {
		Session session = null;

		try {
			session = getSession();
			session.beginTransaction();
			session.merge(dispositivo);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}
	}

}
